﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ControlsLib.Filters;
using GestionePolveriLib.BL.FilterBags;
using GestionePolveriLib.Facades;
using GestionePolveriLib.BL;
using GestionePolveriLib.Utilities;

namespace GestionePolveri2.Filters
{
    public partial class ReportTracciabilitaFilter : ReportTracciabilitaFilterBase
    {
        public ReportTracciabilitaFilter()
        {
            InitializeComponent();

            if (!DesignMode)
            {
                RefreshData();

                this.FromDate = DateTime.Now;
                this.ToDate = DateTime.Now;
            }
        }

        protected override void OnResetFilter(EventArgs e)
        {
            base.OnResetFilter(e);

            this.cmbLotti.SelectedIndex = -1;
            this.txtOperatore.Clear();

            this.chkCmbImpianti.SetEditValue(null);
            this.chkCmbImpianti.Text = "Seleziona un impianto";

            this.chkCmbCausali.SetEditValue(null);
            this.chkCmbCausali.Text = "Seleziona una causale";

            this.cmbColori.SelectedIndex = -1;
            this.cmbPolveri.SelectedIndex = -1;
            this.chkCmbFamiglia.SetEditValue(null);
            this.chkCmbFamiglia.Text = "Seleziona un famiglia";

            this.FilterBag.ColoriAbbinati = null;
            this.FilterBag.CodicePolvere = null;
            this.FilterBag.Famiglia = null;
            this.FilterBag.Fornitore = null;

            this.FilterBag.Causale = null;
            this.FilterBag.CodiceLotto = null;
            this.FilterBag.Impianto = null;
            this.FilterBag.Operatore = null;
        }

        protected override void OnExecuteFilter(EventArgs e)
        {
            this.FilterBag.UseDates = this.UseDatesFilter;

            if (!this.UseDatesFilter)
            {
                this.FilterBag.PeriodFrom = null;
                FilterBag.PeriodTo = null;
            }
            else
            {
                FilterBag.PeriodFrom = this.FromDate;
                FilterBag.PeriodTo = this.ToDate;
            }

            //if (this.cmbLotti.SelectedItem == null)
            //    this.cmbLotti.SelectedIndex = -1;
            //if (this.cmbColori.SelectedItem == null)
            //    this.cmbColori.SelectedIndex = -1;
            //if (this.cmbPolveri.SelectedItem == null)
            //    this.cmbPolveri.SelectedIndex = -1;
            //if (this.cmbFornitori.SelectedItem == null)
            //    this.cmbFornitori.SelectedIndex = -1;

            Lotto lottoSelected = FilterComboBoxHelper.GetSelectedItem<Lotto>(this.cmbLotti);
            Polvere polvereSelected = FilterComboBoxHelper.GetSelectedItem<Polvere>(this.cmbPolveri);
            Colore coloreSelected = FilterComboBoxHelper.GetSelectedItem<Colore>(this.cmbColori);
            Fornitore fornitoreSelected = FilterComboBoxHelper.GetSelectedItem<Fornitore>(this.cmbFornitori);

            FilterBag.Operatore = (string.IsNullOrWhiteSpace(this.txtOperatore.Text) ? null : this.txtOperatore.Text);
            //FilterBag.Impianto = (this.chkCmbImpianti.Properties.GetCheckedItems().ToString() == string.Empty ? null : this.chkCmbImpianti.Properties.GetCheckedItems().ToString());
            FilterBag.CodiceLotto = (lottoSelected == null ? null : ((Lotto)this.cmbLotti.SelectedItem).CodLotto);

            FilterBag.Fornitore = (fornitoreSelected == null ? null : ((Fornitore)this.cmbFornitori.SelectedItem).Descrizione);
            FilterBag.ColoriAbbinati = (coloreSelected == null ? null : ((Colore)this.cmbColori.SelectedItem).CodiceColore);
            FilterBag.CodicePolvere = (polvereSelected == null ? null : ((Polvere)this.cmbPolveri.SelectedItem).CodicePolvere);
            FilterBag.Famiglia = (this.chkCmbFamiglia.Properties.GetCheckedItems().ToString() == string.Empty ? null : this.chkCmbFamiglia.Properties.GetCheckedItems().ToString());

            string impianti = (this.chkCmbImpianti.Properties.GetCheckedItems().ToString() == string.Empty ? null : this.chkCmbImpianti.Properties.GetCheckedItems().ToString());
            if (impianti != null)
            {
                List<int> imps = impianti.Split(',').ToList().ConvertAll<int>(s => Convert.ToInt32(s));
                FilterBag.Impianto = imps.ToArray();
            }

            if (FilterBag.Famiglia != null)
              FilterBag.Famiglia = FilterBag.Famiglia.Replace(" ", "");

            //
            string causali = (this.chkCmbCausali.Properties.GetCheckedItems().ToString() == string.Empty ? null : this.chkCmbCausali.Properties.GetCheckedItems().ToString());
            if (causali != null)
            {
                List<int> ints = causali.Split(',').ToList().ConvertAll<int>(s => Convert.ToInt32(s));
                FilterBag.Causale = ints.ToArray();
            }

            if (
                (this.cmbLotti.SelectedIndex == -1) &&
                (FilterBag.Operatore == null) &&
                (FilterBag.CodiceLotto == null) &&
                (FilterBag.Causale == null) &&
                (FilterBag.Impianto == null) &&
                (FilterBag.ColoriAbbinati == null) &&
                (FilterBag.CodicePolvere == null) &&
                (FilterBag.Fornitore == null) &&
                (FilterBag.Famiglia == null) &&
                (FilterBag.UseDates == false)
              )
            {
                OnResetFilter(e);
                this.OnFilterButtonClick();
            }
            else
            {
                base.OnExecuteFilter(e);
            }

            //base.OnExecuteFilter(e);
        }

        private void LoadImpianti()
        {
            ImpiantoFacade pf = new ImpiantoFacade();

            pf.RunAsync(() => pf.GetImpianti(), (result) =>
            {
                if (result != null)
                {
                    this.chkCmbImpianti.Properties.DisplayMember = "Nome";
                    this.chkCmbImpianti.Properties.ValueMember = "ID";
                    this.chkCmbImpianti.Properties.DataSource = result;
                }
            });
        }

        public void LoadLotti()
        {
            FilterComboBoxHelper.SetupLottiComboBox(this.cmbLotti);
        }

        private void LoadCausali()
        {
            CausaliMagazzinoFacade pf = new CausaliMagazzinoFacade();
            pf.RunAsync(() => pf.GetAll(), (result) =>
            {
                if (result != null)
                {
                    this.chkCmbCausali.Properties.DisplayMember = "Descrizione";
                    this.chkCmbCausali.Properties.ValueMember = "ID";
                    this.chkCmbCausali.Properties.DataSource = result;
                }
            });
        }

        public override void RefreshData()
        {
            LoadCausali();
            LoadImpianti();
            LoadLotti();
            LoadPolveri();
            LoadColori();
            LoadFamiglie();
            LoadFornitori();
        }

        private void LoadPolveri()
        {
            FilterComboBoxHelper.SetupPolveriComboBox(this.cmbPolveri);
        }

        private void LoadColori()
        {
            FilterComboBoxHelper.SetupColoriComboBox(this.cmbColori);
        }

        private void LoadFamiglie()
        {
            FamigliaColoriFacade pf = new FamigliaColoriFacade();

            pf.RunAsync(() => pf.GetAll(), (result) =>
            {
                if (result != null)
                {
                    this.chkCmbFamiglia.Properties.Items.Clear();

                    this.chkCmbFamiglia.Properties.DisplayMember = "Descrizione";
                    this.chkCmbFamiglia.Properties.ValueMember = "ID";
                    this.chkCmbFamiglia.Properties.DataSource = result;
                }
            });
        }

        private void LoadFornitori()
        {
            FilterComboBoxHelper.SetupFornitoriComboBox(this.cmbFornitori);
        }
    }

    public class ReportTracciabilitaFilterBase : FilterContainerBase2<ReportTracciabilitaFilterBag> { }
}
